import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

/**
 * 基础代码
 */
export default function (container) {
  //场景
  const scene = new THREE.Scene();
  // scene.background = '#fff'
  // scene.add(new THREE.AxesHelper(20));
  scene.add(new THREE.GridHelper(30, 30));

  // 摄像机

  const camera = new THREE.PerspectiveCamera(75, container.value.clientWidth / container.value.clientHeight, 0.1, 1000);
  camera.position.set(0, 10, 15); // 设置相机位置
  camera.lookAt(0, 0, 0); // 设置相机方向
  scene.add(camera);

  //光源
  // 添加环境光（辅助照明）
  const ambient = new THREE.AmbientLight(0x404040, 1); // 创建环境光
  scene.add(ambient);
  // 添加半球光（模拟天空和地面反射）
  const hemisphereLight = new THREE.HemisphereLight("#ffffff", 0x080820, 1);
  scene.add(hemisphereLight);
  // 添加主光源（方向光）
  const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
  directionalLight.position.set(0, 50, 10);
  scene.add(directionalLight);

  //渲染器
  const renderer = new THREE.WebGLRenderer({
    antialias: true // 开启抗锯齿
    // alpha: true // 关键：启用渲染器透明度
  });
  // 设置设备像素比。通常用于避免HiDPI设备上绘图模糊
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(container.value.clientWidth, container.value.clientHeight);
  // 设置色调映射  这个属性用于在普通计算机显示器或者移动设备屏幕等低动态范围介质上，模拟、逼近高动态范围（HDR）效果。
  // renderer.toneMapping = THREE.ReinhardToneMapping;
  // renderer.outputEncoding = THREE.sRGBEncoding;
  renderer.shadowMap.enabled = false; // 显示阴影
  renderer.setClearColor("#171A29", 1); // 设置背景颜色
  container.value.appendChild(renderer.domElement);

  //控制器
  const controls = new OrbitControls(camera, renderer.domElement);
  // 设置相机垂直旋转范围（弧度）
  controls.minPolarAngle = 0; // 最小仰角（0表示正上方）
  controls.maxPolarAngle = (Math.PI / 180) * 89; // 最大仰角（π/2表示水平面）

  // 设置缩放范围
  // controls.minDistance = 3;
  // controls.maxDistance = 20;

  // 适配窗口
  window.addEventListener("resize", () => {
    const width = container.value.clientWidth;
    const height = container.value.clientHeight;
    camera.aspect = width / height; // 重置摄像机视锥体的长宽比
    camera.updateProjectionMatrix(); // 更新摄像机投影矩阵
    renderer.setSize(width, height); // 重置画布大小
  });

  return {
    scene,
    camera,
    renderer,
    controls
  };
}
